package logica;

import java.awt.geom.Point2D;
import java.util.LinkedList;

/**
 * De klasse Boid erft van de abstracte bovenklasse Dier.
 * De klasse erft alle attributen en methodes.
 * <p>
 * Een Boid is een gesimuleerde vis die zich voortbeweegt aan een constante
 * snelheid.
 * <p>
 * De methode Dier::update() moet in deze klasse verder worden geïmplementeerd.
 * @see Dier
 *
 * @author Bart Bruynooghe
 * @author Benjamin De Clercq
 * @author Thomas Flamant
 * @author Sander Van den Broecke
 */
public class Boid extends Dier {

	// constanten
	protected static final int HORIZON = 50;
	protected static final int ONTWIJKBOID = 3;
	protected static final int PASAANBOIDS = 25;
	protected static final int SNELHEID = 4;

	// dataleden
	/* OVERGEERFDE DATALEDEN VAN DIER
	 * protected Point positie;
	 * protected Point snelheid;
	 * protected Zee myZee;
	 */
	
	/**
	 * De constructor van Boid roept de constructor van zijn bovenklasse
	 * Dier op.
	 * @param  myZee   De zee van de Boid
	 * @param  positie De positie van de Boid
	 * @see    Dier
	 */
	// constructor
	public Boid(Zee myZee, Point2D.Double positie, double richting) {
		super(myZee, positie, richting);
	}

	// methodes
	/**
	 * Hier wordt extra functionaliteit toegevoegd aan de methode update()
	 * uit de abstracte bovenklasse Dier.
	 * @see    Dier
	 */
	@Override
	public void update() {
		boolean isBezigOntwijkenObstakel = ontwijkObstakels();
		verplaats();
		if (!isBezigOntwijkenObstakel) {
			LinkedList<Dier> dierenInOmtrek = myZee.getDieren(HORIZON, positie);
			boolean isBezigOntwijkenOrka = false;
			for (Dier d : dierenInOmtrek) {
				if (d instanceof Orka) {
					richting = (Math.PI + berekenHoek(d.getPositie())) % (Math.PI * 2);
					isBezigOntwijkenOrka = true;
				}
			}
			if (!isBezigOntwijkenOrka) {
				int aantalRichtingen = 1;
				double somRichting = richting;
				for (Dier d : dierenInOmtrek) {
					if (positie.distance(d.getPositie()) < PASAANBOIDS && positie.distance(d.getPositie()) > ONTWIJKBOID) {
						somRichting += d.getRichting();
						aantalRichtingen++;
					}
				}
				richting = somRichting / aantalRichtingen;
			}
		}
	}

	/**
	 * Hier wordt de methode verplaats() ingevuld
	 * uit de abstracte bovenklasse Dier.
	 * @see    Dier
	 */
	@Override
	protected void verplaats() {
		double x = positie.x + SNELHEID * Math.cos(richting);
		double y = positie.y + SNELHEID * Math.sin(richting);
		positie = new Point2D.Double(x, y);
	}
}
